﻿using System;
using System.Text;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;

namespace GUI
{
    using DevExpress.XtraGrid;
    using DevExpress.XtraGrid.Views.Layout;
    using DevExpress.XtraGrid.Columns;
    using DevExpress.XtraLayout;
    using DevExpress.XtraLayout.Customization;
    using DevExpress.XtraLayout.Utils;
    using DevExpress.XtraEditors.Repository;
    using DevExpress.XtraEditors.Controls;

    using GUI.Library;
    using WS.DAL.Entities;

    using DevExpress.XtraEditors;

    public partial class FrmSanpham : GUI.FrmInput
    {
        #region Implements
        #endregion

        protected override void LoadData()
        {
            _dtb = _bllBus.Sanpham_Select();

            if (_dtb != null)
            {
                gcDS.DataSource = _dtb;
                gvDS.BestFitColumns();
            }

            base.LoadData();
        }

        protected override void PerformRefresh()
        {
            LoadData();

            if (_dtb != null)
            {
                ClearDataBindings();
                if (_dtb.Rows.Count > 0) DataBindingControl();
            }

            ReadOnlyControl();

            base.PerformRefresh();
        }

        protected override void PerformAdd()
        {
            txtThem.Text = null;
            txtThem.Properties.ReadOnly = true;
            base.PerformAdd();
            txtMa.Text = _bllBus.Sanpham_Layma();
        }

        protected override void PerformEdit()
        {
            var tmpId = gvDS.GetFocusedRowCellValue("Id");
            if (tmpId == null)
            {
                XtraMessageBox.Show(STR_CHOICE_E,
                    Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            txtSoluong.Properties.ReadOnly = true;
            txtThem.Text = "0";
            txtThem.Properties.ReadOnly = false;

            base.PerformEdit();
        }

        protected override void PerformDelete()
        {
            var tmpId = gvDS.GetFocusedRowCellValue("Id");
            if (tmpId == null)
            {
                XtraMessageBox.Show(STR_CHOICE,
                    Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            var text = gvDS.GetFocusedRowCellValue("Ten");
            var id = (Guid)tmpId;

            if (id == new Guid())
                XtraMessageBox.Show(STR_SELECT.ToUpper(), STR_DELETE.ToUpper(),
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
            {
                var cfm = String.Format(STR_CONFIRM, text);
                var oki = XtraMessageBox.Show(cfm.ToUpper(), STR_DELETE.ToUpper(), MessageBoxButtons.OKCancel);

                if (oki == DialogResult.OK)
                    if (_bllBus.USanpham_Delete(id).ToInt32() ==1) PerformRefresh();
                    else XtraMessageBox.Show(STR_UNDELETE.ToUpper(), STR_DELETE.ToUpper(),
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            base.PerformDelete();
        }

        protected override void PerformSave()
        {
            if (!ValidInput())
            {
                XtraMessageBox.Show("Cần nhập thông tin cho sản phẩm trước", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            switch (_state)
            {
                case State.Add:
                    if (InsertObject())
                    {
                        ResetInput();
                        LoadData();
                        txtMa.Text = _bllBus.Sanpham_Layma();
                        XtraMessageBox.Show("Lưu thành công!", "Lưu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        txtTen.Focus();
                    }
                    break;

                case State.Edit:
                    if (UpdateObject())
                    {
                        ChangeStatus();
                        ReadOnlyControl();
                        PerformRefresh();
                        XtraMessageBox.Show("Lưu thành công!", "Lưu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    break;

                default:
                    break;
            }
            base.PerformSave();
        }

        protected override bool UpdateObject()
        {
            try
            {
                if (!ValidInput()) return false;

                var id = (Guid)gvDS.GetFocusedRowCellValue("Id");

                var o = new Sanpham();
                o.Id = id;
                o.Ma = _bllBus.Sanpham_Layma();
                o.Ten = txtTen.Text.ToUpperFirst();
                o.Loaihang_Id = lokLoai.EditValue.GetGuid();
                o.NSX_Id = lokNSX.EditValue.GetGuid();
                o.Gianhap = txtGianhap.EditValue.ToInt32();
                o.Giaban = txtGiaban.EditValue.ToInt32();
                o.Soluong = txtSoluong.EditValue.ToInt32() + txtThem.EditValue.ToInt32();
                o.Donvitinh_Id = lokDonvitinh.EditValue.GetGuid();
                o.Hinh = ptcHinh.PictureToArray();

                if (_bllBus.Sanpham_Update(o).ToInt32() == 1)
                {
                    return true;
                }
                else
                {
                    XtraMessageBox.Show("Không thể truy suất dữ liệu", "Lổi truy xuất dữ liệu khi cập nhật", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch
            {
                XtraMessageBox.Show("Dữ liệu về thông tin sản phẩm chưa đúng", "Lổi giới hạn dữ liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        protected override bool InsertObject()
        {
            try
            {
                if (!ValidInput()) return false;

                var o = new Sanpham();
                o.Id = Guid.NewGuid();
                o.Ma = _bllBus.Sanpham_Layma();
                o.Ten = txtTen.Text.ToUpperFirst();
                o.Loaihang_Id = lokLoai.EditValue.GetGuid();
                o.NSX_Id = lokNSX.EditValue.GetGuid();
                o.Gianhap = txtGianhap.EditValue.ToInt32();
                o.Giaban = txtGiaban.EditValue.ToInt32();
                o.Soluong = txtSoluong.EditValue.ToInt32() + txtThem.EditValue.ToInt32();
                o.Donvitinh_Id = lokDonvitinh.EditValue.GetGuid();
                o.Hinh = ptcHinh.PictureToArray();
                if (_bllBus.Sanpham_Insert(o).ToInt32() != null)
                {
                    return true;
                }
                else
                {
                    XtraMessageBox.Show("Không thể truy suất dữ liệu", "Lổi truy xuất dữ liệu khi cập nhật", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch
            {
                XtraMessageBox.Show("Dữ liệu về thông tin sản phẩm chưa đúng", "Lổi giới hạn dữ liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        protected override void ResetInput()
        {
            txtMa.Text = null;
            txtTen.Text = null;
            lokLoai.EditValue = null;
            lokNSX.EditValue = null;
            txtGianhap.Text = null;
            txtGiaban.Text = null;
            txtSoluong.Text = null;
            txtThem.Text = "0";
            lokDonvitinh.EditValue = null;
            ptcHinh.Image = global::GUI.Properties.Resources.OnImage;

            base.ResetInput();
        }

        protected override void ClearDataBindings()
        {
            txtMa.DataBindings.Clear();
            txtTen.DataBindings.Clear();
            lokLoai.DataBindings.Clear();
            lokNSX.DataBindings.Clear();
            txtGianhap.DataBindings.Clear();
            txtGiaban.DataBindings.Clear();
            txtSoluong.DataBindings.Clear();
            lokDonvitinh.DataBindings.Clear();

            base.ClearDataBindings();
        }

        protected override void DataBindingControl()
        {
            txtMa.DataBindings.Add("EditValue", _dtb, ".Ma");
            txtTen.DataBindings.Add("EditValue", _dtb, ".Ten");
            lokLoai.DataBindings.Add("EditValue", _dtb, ".Loaihang_Id");
            lokNSX.DataBindings.Add("EditValue", _dtb, ".NSX_Id");
            txtGianhap.DataBindings.Add("EditValue", _dtb, ".Gianhap");
            txtGiaban.DataBindings.Add("EditValue", _dtb, ".Giaban");
            txtSoluong.DataBindings.Add("EditValue", _dtb, ".Soluong");
            lokDonvitinh.DataBindings.Add("EditValue", _dtb, ".Donvitinh_Id");

            base.DataBindingControl();
        }

        protected override void ReadOnlyControl(bool isReadOnly = true)
        {
            txtMa.Properties.ReadOnly = isReadOnly;
            txtTen.Properties.ReadOnly = isReadOnly;
            lokLoai.Properties.ReadOnly = isReadOnly;
            lokNSX.Properties.ReadOnly = isReadOnly;
            txtGianhap.Properties.ReadOnly = isReadOnly;
            txtGiaban.Properties.ReadOnly = isReadOnly;
            txtSoluong.Properties.ReadOnly = isReadOnly;
            lokDonvitinh.Properties.ReadOnly = isReadOnly;

            gcDS.Enabled = isReadOnly;

            base.ReadOnlyControl(isReadOnly);
        }

        protected override bool ValidInput()
        {
            if (txtTen.Text.Trim() == "") return false;
            return true;
        }

        //#endregion

        #region Methods
        public FrmSanpham()
        {
            InitializeComponent();
            _bllCat = new SV.Catalog();
            _bllBus = new SV.Bussiness();
            Text = "Sản phẩm";

            dockPanel1.SetDockPanel(Global.STR_PAN1);
            dockPanel2.SetDockPanel(Global.STR_PAN2);

            //load hình Sub cho sản phẩm
            gcHinhSub.DataSource = null;
            palHinhSub.Controls.Clear();
            palHinhSub.Controls.Add(gcHinhSub);
            gcHinhSub.Dock = DockStyle.Fill;
            lvDS = new LayoutView(gcHinhSub);
            gcHinhSub.MainView = lvDS;
            lvDS.OptionsView.ViewMode = LayoutViewMode.Carousel;
            LayoutViewColumn colMota = lvDS.Columns.AddField("Mota");
            LayoutViewColumn colHinh = lvDS.Columns.AddField("Hinh");

            LayoutViewField fieldMa = colMota.LayoutViewField;
            LayoutViewField fieldTen = colHinh.LayoutViewField;

            colHinh.Visible = true;

            RepositoryItemPictureEdit riPictureEdit = gcHinhSub.RepositoryItems.Add("PictureEdit") as RepositoryItemPictureEdit;
            riPictureEdit.SizeMode = PictureSizeMode.Squeeze;
            colHinh.ColumnEdit = riPictureEdit;
        }
        #endregion

        #region Events
        /// <summary>
        /// Numbered
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gvMain_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
        {
            if (e.Info.IsRowIndicator)
            {
                if (e.RowHandle < 0) return;

                e.Info.DisplayText = "" + (e.RowHandle + 1);
                e.Handled = false;
            }
        }
        #endregion

        #region Properties
        #endregion

        #region Fields
        string _name;
        #endregion

        #region Constants
        private const string STR_TITLE = "Loại hàng";
        private const string STR_ADD = "Thêm " + STR_TITLE;
        private const string STR_EDIT = "Sửa " + STR_TITLE;
        private const string STR_DELETE = "Xoá " + STR_TITLE;

        private const string STR_SELECT = "Chọn dữ liệu!";
        private const string STR_CONFIRM = "Có xoá loại hàng '{0}' không?";
        private const string STR_UNDELETE = "Không xoá được!\nDữ liệu đang được sử dụng.";
        private const string STR_DUPLICATE = "Sản phẩm này có rồi";

        private const string STR_CHOICE = "CHỌN DÒNG CẦN XOÁ\n\rHOẶC KHÔNG ĐƯỢC CHỌN NHÓM ĐỂ XOÁ";
        private const string STR_CHOICE_E = "CHỌN DÒNG CẦN SỬA\n\r HOẶC KHÔNG ĐƯỢC CHỌN NHÓM ĐỂ SỬA";
        #endregion

        private void gvDS_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            var TempId = gvDS.GetFocusedRowCellValue("Id");
            if (TempId != null)
            {
                ptcHinh.Image = ((byte[])gvDS.GetFocusedRowCellValue("Hinh")).ArrayToPicture();
                Fill_HinhSub(_bllBus.HinhSub_Select_Sanpham_Id((Guid)gvDS.GetFocusedRowCellValue("Id")));
            }
        }

        private void FrmSanpham_Load(object sender, EventArgs e)
        {
            lokLoai.Properties.DataSource = _bllCat.Danhmuc_Select_Loai("Loaihang");
            lokNSX.Properties.DataSource = _bllCat.Danhmuc_Select_Loai("NSX");
            lokDonvitinh.Properties.DataSource = _bllCat.Danhmuc_Select_Loai("Donvitinh");
        }

        private void btnLoad_Hinh_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Chọn file ảnh từ máy";
            ofd.Filter = "File ảnh là được JPG Files(*.JPG)|*.JPG|GIF Files(*.GIF)|*.GIF";
            if (ofd.ShowDialog(this) == DialogResult.OK)
            {
                ptcHinh.ImageLocation = ofd.FileName;
            }
        }

        GridControl gcHinhSub = new GridControl();
        LayoutView lvDS;

        private void Fill_HinhSub(DataTable dt)
        {
            if (dt.Rows.Count > 0)
            {
                gcHinhSub.DataSource = dt;
            }
            else gcHinhSub.DataSource = null;
        }

        Guid Sanpham_Id_Curent;
        private void btnMorePicture_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Chọn file ảnh từ máy";
            ofd.Filter = "File ảnh là được JPG Files(*.JPG)|*.JPG|GIF Files(*.GIF)|*.GIF";
            Sanpham_Id_Curent = (Guid)gvDS.GetFocusedRowCellValue("Id");
            if (ofd.ShowDialog(this) == DialogResult.OK)
            {
                ptcHinhSub.ImageLocation = ofd.FileName;
                DialogResult oki = XtraMessageBox.Show("Bạn có muốn thêm hình này cho sản phẩm có mã " + gvDS.GetFocusedRowCellValue("Ma").ToString() + "không?", "Xác nhận thêm hình liên quan", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                if (oki == DialogResult.OK)
                {
                    HinhSub ptcSub = new HinhSub();
                    ptcSub.Id = Guid.NewGuid();
                    ptcSub.Sanpham_Id = (Guid)gvDS.GetFocusedRowCellValue("Id");
                    ptcSub.Mota = "";
                    ptcSub.Hinh = ptcHinhSub.PictureToArray();
                    if (_bllBus.HinhSub_Insert(ptcSub).ToInt32() != null)
                    {
                        XtraMessageBox.Show("Thêm thành công", "Thêm hình liên quan sản phẩm", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Fill_HinhSub(_bllBus.HinhSub_Select_Sanpham_Id(Sanpham_Id_Curent));
                    }
                    else
                    {
                        XtraMessageBox.Show("Không thể truy suất dữ liệu", "Lổi truy xuất dữ liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void btnXoaHinhSub_Click(object sender, EventArgs e)
        {
            if (lvDS.GetFocusedRowCellValue("Id").GetGuid() == Guid.Empty) { XtraMessageBox.Show("Chọn hình để xóa", "Xóa hình chi tiết", MessageBoxButtons.OK, MessageBoxIcon.Information); return; }
            DialogResult oki = XtraMessageBox.Show("Bạn có muốn xóa hình này không","Xóa hình chi tiết sản phẩm",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
            if (oki==DialogResult.OK)
            {
                if (_bllBus.HinhSub_Delete(lvDS.GetFocusedRowCellValue("Id").GetGuid()).ToInt32() == 1)
                {
                    XtraMessageBox.Show("Xóa thành công", "Xóa hình chi tiết", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    gcHinhSub.DataSource = _bllBus.HinhSub_Select_Sanpham_Id(gvDS.GetFocusedRowCellValue("Id").GetGuid());
                }
                else XtraMessageBox.Show("Lổi kết nối cơ sỡ dữ liệu", "Xóa hình chi tiết", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}